home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / ms_dos / compack / src / basefile.asm next >
Encoding:
Assembly Source File  |  1993-07-08  |  5.5 KB  |  307 lines

  1.     .8086
  2.  
  3.     ASSUME    CS:CODE,DS:CODE
  4. CODE    SEGMENT
  5.  
  6.     ORG    0100H
  7.  
  8. START:    JMP    SHORT ENTRY
  9.     DB    'COMPACK'        ;  ID-NAME
  10.     DW    HEADER            ;  ヘッダー位置
  11.  
  12. INCLUDE    SUB.ASM                ;  サブルーチン取り込み
  13.  
  14. ;
  15. ;    MAIN PROGRAM
  16. ;
  17. ENTRY    PROC
  18.     MOV    BX,OFFSET FCB1+1    ;  BX:005DH(FCB1)
  19.     MOV    DL,[BX]            ;  DL:文字数
  20.     CMP    DL,020H            ;  パラメータがない??
  21.     JZ    LIST            ;  動作モード分岐(JNZ:RUN / JZ:LIST)
  22. ;
  23. ;    内部プログラム実行
  24. ;
  25.     CALL    SEARCH            ;  ヘッダ・サーチ( JNC:NOT FOUND )
  26.                     ;   DI:SIZE / BP:ADRS / AL:COMPRESS
  27.     JNC    ERROR
  28.     OR    AL,AL            ;  格納形式を調べる
  29.     JNZ    ERROR2            ;   ( 圧縮は未対応 )
  30.  
  31.     CALL    PSP            ;  PSP(DTA & FCB)作成
  32.     CALL    TRANS            ;  転送プログラムを$F000~に配置
  33.     MOV    AX,0F000H        ;  プログラム転送 & 実行
  34.     JMP    AX
  35. ;
  36. ;    エラー表示
  37. ;
  38. ERROR:    CALL    ZPR
  39.     DB    BELL,'そのコマンドは登録されていません.'
  40.     DB    CR,LF,LF,NULL
  41.     MOV    AX,4C01H        ;  異常終了
  42.     INT    21H            ;  DOSに戻る
  43.  
  44. ERROR2:    CALL    ZPR
  45.     DB    BELL,'未サポートの格納形式です.'
  46.     DB    CR,LF,LF,NULL
  47.     MOV    AX,4C01H        ;  異常終了
  48.     INT    21H            ;  DOSに戻る
  49.  
  50. ;
  51. ;    コマンド一覧表示
  52. ;
  53. LIST:    CALL    ZPR
  54.     DB    '--------- Listing of basefile ---------'
  55.     DB    CR,LF,NULL
  56.     MOV    BX,OFFSET HEADER    ;  BX:ポインタ
  57.     MOV    DL,[BX]            ;  DL:プログラム連結数
  58.     INC    BX
  59. LIST1:    XOR    AL,AL
  60.     MOV    [BX+8],AL        ;  文字終了マーク書き込み
  61.     CALL    ZPR2            ;  コマンド名表示
  62.     CALL    ZPR
  63.     DB    TAB,NULL
  64.     ADD    BX,010H            ;  次のヘッダにスキップ
  65.     DEC    DL
  66.     JNZ    SHORT LIST1
  67.     CALL    ZPR
  68.     DB    CR,LF,LF,NULL
  69.     MOV    AX,4C00H        ;  正常終了
  70.     INT    21H            ;  DOSに戻る
  71. ENTRY    ENDP
  72.  
  73.  
  74. SEARCH    PROC
  75.     MOV    SI,OFFSET HEADER    ;  SI:ポインタ
  76.     MOV    DL,[SI]            ;  DL:プログラム連結数
  77.     INC    SI
  78. #LOOP1:    CALL    COMPARE            ;  コマンド名を比較(CY=1..○/CY=0..×)
  79.     JC    SHORT #QUIT        ;  ○だったら脱出
  80.     ADD    SI,010H            ;  ×だったらヘッダーを一つスキップ
  81.     DEC    DL
  82.     JNZ    SHORT #LOOP1        ;  まだコマンドが残ってる??
  83.     CLC                ;  見つからなかったねぇ...
  84.     RET
  85. #QUIT:    ADD    SI,8
  86.     MOV    DI,[SI]            ;  DI:プログラムサイズ
  87.     ADD    SI,2
  88.     MOV    BP,[SI]            ;  BP:プログラム開始アドレス
  89.     ADD    SI,2
  90.     MOV    AL,[SI]            ;  AL:圧縮フラグ
  91.     STC
  92.     RET
  93. SEARCH    ENDP
  94.  
  95.  
  96. COMPARE    PROC
  97.     PUSH    SI
  98.     PUSH    DX
  99.     MOV    AH,8
  100.     MOV    BX,OFFSET FCB1+1        ;  BX:005D (第一パラメータ)
  101. #LOOP1:    MOV    DL,[BX]
  102.     MOV    AL,[SI]
  103.     INC    BX
  104.     INC    SI
  105.     CMP    DL,AL
  106.     JNZ    SHORT #RST_C        ;  ミスマッチ時は、キャリーリセット
  107.     DEC    AH            ;  比較終了(8文字)
  108.     JNZ    SHORT #LOOP1
  109. #SET_C:    STC
  110.     POP    DX
  111.     POP    SI
  112.     RET
  113. #RST_C:    CLC
  114.     POP    DX
  115.     POP    SI
  116.     RET
  117. COMPARE    ENDP
  118.  
  119. ;   パラメータを1つパス(前後のスペースも飛ばす)    BX:パラメータ先頭
  120. PASS    PROC
  121. #LOOP0:    MOV    AL,[BX]            ;
  122.     INC    BX            ;    前のスペースをパス
  123.     CMP    AL,020H            ;
  124.     JZ    SHORT #LOOP0        ;
  125.     DEC    BX            ;
  126.  
  127. #LOOP1:    MOV    AL,[BX]            ;
  128.     CMP    AL,CR            ;  CR/SPACE 以外をパス
  129.     JZ    SHORT #BYE        ;
  130.     CMP    AL,020H            ;
  131.     JZ    SHORT #NEXT0        ;
  132.     INC    BX            ;
  133.     JMP    SHORT #LOOP1        ;
  134.  
  135. #NEXT0:    MOV    AL,[BX]            ;
  136.     INC    BX            ;    後ろのスペースをパス
  137.     CMP    AL,020H            ;
  138.     JZ    SHORT #NEXT0        ;
  139.     DEC    BX
  140. #BYE:    RET
  141. PASS    ENDP
  142.  
  143.  
  144. PSP    PROC
  145.     MOV    SI,OFFSET FCB1        ;
  146.     MOV    BX,OFFSET FCB2        ;
  147.     MOV    DL,010H            ;
  148. #LOOP0:    MOV    AL,[BX]            ;
  149.     INC    BX            ;
  150.     MOV    [SI],AL            ; FCB1の作成
  151.     INC    SI            ;     ( FCB2 を複写 ^^; )
  152.     DEC    DL            ;
  153.     JNZ    SHORT #LOOP0        ;
  154.  
  155.     MOV    SI,FCB2            ;  省略してしまえ!!
  156.  
  157.     XOR    AL,AL            ;
  158.     MOV    [SI],AL            ;  ドライブをカレントにする
  159.     INC    SI            ;     ( FCB2 の仮作成・その1 )
  160.  
  161.     MOV    DL,11            ;
  162.     MOV    AL,020H            ;  ファイル名をスペースで埋める
  163. #LOOP1:    MOV    [SI],AL            ;     ( FCB2 の仮作成・その2 )
  164.     INC    SI            ;
  165.     DEC    DL            ;
  166.     JNZ    SHORT #LOOP1        ;
  167.  
  168.     MOV    BX,OFFSET DTA+1
  169.     CALL    PASS            ;  第一パラメータ(コマンド名)をパス
  170.     CALL    PASS            ;  第二パラメータ(FCBに展開済)をパス
  171.     MOV    SI,OFFSET FCB2
  172.  
  173.     CMP    AL,CR            ;
  174.     JZ    SHORT #BYE        ;  もうパラメータがなければ終了
  175.  
  176.     MOV    AX,[BX]            ;  パラメータの二バイト目が・・・
  177.     CMP    AH,03AH            ;               ':' じゃない時は、
  178.     JNZ    SHORT #NEXT1        ;                 ドライブ番号処理なし
  179.  
  180.     CALL    CHECK
  181.     JNC    SHORT #BYE        ;  JNC:×
  182.     CMP    AL,02EH            ;  '.'もダメ
  183.     JE    SHORT #BYE
  184.     CAPITAL    AL
  185.     SUB    AL,040H
  186.     MOV    [SI],AL
  187.     ADD    BX,2            ;  ドライブ名はパス
  188.  
  189. #NEXT1:    INC    SI
  190.     MOV    DL,8
  191.  
  192. #LOOP2:    MOV    AL,[BX]
  193.     INC    BX
  194.     CALL    CHECK
  195.     JNC    SHORT #BYE        ;  JNC:×
  196.     CMP    AL,02EH            ;  '.'
  197.     JZ    SHORT #NEXT2
  198.     MOV    [SI],AL
  199.     INC    SI
  200.     DEC    DL
  201.     JNZ    SHORT #LOOP2
  202.  
  203. #LOOP:    MOV    AL,[BX]
  204.     INC    BX
  205.     CALL    CHECK
  206.     JNC    SHORT #BYE        ;   JNC:×
  207.     CMP    AL,02EH
  208.     JZ    SHORT #NEXT2
  209.     JMP    SHORT #LOOP
  210.  
  211.  
  212. #NEXT2:    MOV    SI,0075H
  213.     MOV    DL,3
  214.  
  215. #LOOP3:    MOV    AL,[BX]
  216.     INC    BX
  217.     CALL    CHECK
  218.     JNC    SHORT #BYE        ;  JNC:×
  219.     CMP    AL,02EH            ;  '.'
  220.     JZ    SHORT #BYE
  221.     MOV    [SI],AL
  222.     INC    SI
  223.     DEC    DL
  224.     JNZ    SHORT #LOOP3
  225.  
  226. #BYE:    MOV    BX,OFFSET DTA+1
  227.     MOV    SI,BX
  228.     CALL    PASS
  229.     CMP    AL,CR
  230.     JZ    SHORT #BYE2
  231.     DEC    BX
  232.     INC    DL
  233.  
  234. #BYE2:    PUSH    BX
  235.     SUB    BX,SI
  236.     DEC    SI
  237.     MOV    AL,[SI]
  238.     SUB    AL,BL
  239.     MOV    [SI],AL
  240.     INC    SI
  241.  
  242.     MOV    DL,AL
  243.     POP    BX
  244.     INC    DL
  245. #LOOP4:    MOV    AL,[BX]
  246.     MOV    [SI],AL
  247.     INC    BX
  248.     INC    SI
  249.     DEC    DL
  250.     JNZ    SHORT #LOOP4
  251.     RET
  252. PSP    ENDP
  253.  
  254. ;    ファイル名に有効なキャラクタかどうか調べる(AL)
  255. CHECK    PROC
  256.     CMP    AL,05EH
  257.     JNC    SHORT #S_RET
  258.     CMP    AL,05BH
  259.     JNC    SHORT #C_RET
  260.     CMP    AL,040H
  261.     JNC    SHORT #S_RET
  262.     CMP    AL,03AH
  263.     JNC    SHORT #C_RET
  264.     CMP    AL,02DH
  265.     JNC    SHORT #S_RET
  266.     CMP    AL,02AH
  267.     JNC    SHORT #C_RET
  268.     CMP    AL,021H
  269.     JNC    SHORT #S_RET
  270.  
  271. #C_RET: CLC                ;
  272.     RET                ;  JNC   :×
  273. #S_RET:    STC                ;  JC    :○
  274.     RET                ;
  275. CHECK    ENDP
  276.  
  277. TRANS    PROC
  278.     MOV    BX,0F000H
  279.     MOV    SI,OFFSET EXEC
  280.     MOV    DL,BYTE PTR HEADER-EXEC
  281. #LOOP:    MOV    AL,[SI]
  282.     INC    SI
  283.     MOV    [BX],AL
  284.     INC    BX
  285.     DEC    DL
  286.     JNZ    SHORT #LOOP
  287.     RET
  288. TRANS    ENDP
  289.  
  290.  
  291. EXEC    PROC                ; アドレスBPから、DIバイトをコピー
  292.     MOV    BX,0100H
  293. #EXEC1:    MOV    AL,[BP]
  294.     INC    BP
  295.     MOV    [BX],AL
  296.     INC    BX
  297.     DEC    DI
  298.     JNZ    SHORT #EXEC1
  299.     MOV    AX,0100H
  300.     JMP    AX
  301. EXEC    ENDP
  302.  
  303.  
  304. HEADER    DB    00            ;  ヘッダー開始位置,プログラム連結数ゼロ
  305. CODE    ENDS
  306.     END    START
  307.